<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			function test(){ 
				var arr = [];
				for (var i = 0; i < 10; i++){
					// 第一种
					// arr[i] = function(){
					// 	document.write(i + ' ');
					// };
						 /* 
						  * function()不是立即执行函数，
						  * 所以这个函数压根没有执行,
						  * 所以arr[0] = function(),
						  * 依次类推一直到arr[9] = function(),
						  * 当i=10时,for循环结束,return arr,
						  * 结果返回了10个闭包
						  * 如果想输出的是0~9,那么直接在函数加个(),变成立即执行函数即可
						  */ 
					// 第二种
					arr[i] = function(num){
						document.write(num + ' ');
					};		
						 /* 
						  * 给函数一个形参，让外面传值进来改变i的值
						  * 
						  */
					
					
					
					// 第三种(用得最多)
					// (function(j){
					// 	arr[j] = function(){
					// 		document.write(j + ' ');
					// 	}
					// })(i);
						/* 
						 * 第二种方法是在for循环里创建一个立即执行函数，
						 * 给立即执行函数一个形参，用来装每次循环的i，
						 * 然后把这个i传给形参，
						 * 因为每次都立即执行，所以i就从循环里输出来了
						 */
					
				}
				
				return arr;
			}
			
			var myArr = test();
			
			for (var j = 0; j < 10; j++){
				myArr[j](j); // 0 1 2 3 4 5 6 7 8 9 错了 应该是10个10
							 // 括号里写j是第二种方法
			}
		</script>
	</body>
</html>
